/**
 * es5 创建类和继承
 */
function Parent (name) {
  // 实例属性
  this.name = name
}

// 定义静态属性和方法=》静态=》不需要new
Parent.ts1 = 1
Parent.tsfn = function () {
  // this输出是谁？调用者
  console.log('es5:', this)
  return 123
}
console.log('调用静态属性和方法', Parent.ts1, Parent.tsfn())

// 原型方法
Parent.prototype.getName = function () {
  console.log(this.name)
}

// es5继承
/**
 * 继承什么？
 * 1. 实例的属性和方法
 * 2. 原型上的属性和方法
 */
function Child (name) {
  // 继承父类属性=》this指的是Child
  Parent.call(this, name)
  this.age = 19
}

// 继承原型
// 不推荐
// Child.prototype = new Parent('小')
// 推荐
Child.prototype = Object.create(Parent.prototype, {
  constructor: {
    value: Child
  }
})
Child.prototype.say = function () {
  console.log(123)
}

/**
 * es6 class 关键字(语法糖)创建类和继承
 */

//  创建一个父类
class Par {
  constructor(name) {
    this.name = name
  }

  getName () {
    console.log(this.name)
  }
}

// 继承 => 使用extends关键字
class Chi extends Par {
  // 如果写了=》必须写全 
  constructor(name) {
    super(name)
    this.name = name
    this.age = 20
    // this.test = 200
    this.fn = () => {
      console.log(this)
    }
  }

  // 属性=>相当于在constructor中写：this.xxx = xxx
  test = 200;
  abc = {
    a: 1
  }

  fnc = () => {
    console.log(this)
  }
  // end
  // 定义静态属性和方法=>使用关键字 static=>语法糖
  static sta2 = []
  static fn2 = () => {
    console.log('在class内部定义：', Chi.sta2, this)
  }

  getAge () {
    console.log(this.age)
  }
}

// 定义静态属性和方法
Chi.sta = 2
// 尖头函数：书写时就确定了this=>获取最近一层的this(context)
Chi.staFn = () => {
  console.log(Chi.sta, this)
}

Chi.staFn3 = function () {
  console.log(this)
}

let ch = new Chi('小天')
Chi.staFn()
Chi.staFn3()
console.log(ch)



